#ifndef __NET_DEBUG_H__
#define __NET_DEBUG_H__

#include "spdlog/spdlog.h"

namespace LiteNetLib::NetDebug
{
    enum class NetDebugLevel
    {
        LOG_INFO,
        LOG_WARN,
        LOG_ERROR,
        LOG_DEBUG
    };

    extern std::shared_ptr<spdlog::logger> debugLog;

    // 是否启用日志输出，默认是 false 不输出
    extern bool logOutput;

    extern NetDebugLevel logLevel;

    // 执行 Init 后会输出日志到文件中，同时程序关闭时需要调用 Dispose 函数
    void Init();

    template<typename... Args>
    inline void Error(spdlog::format_string_t<Args...> fmt, Args &&... args)
    {
        if (logOutput && logLevel <= NetDebugLevel::LOG_ERROR)
        {
            if (debugLog != nullptr)
            {
                debugLog->error(fmt, std::forward<Args>(args)...);
            }
            else
            {
                spdlog::error(fmt, std::forward<Args>(args)...);
            }
        }
    }

    template<typename... Args>
    inline void Warn(spdlog::format_string_t<Args...> fmt, Args &&... args)
    {
        if (logOutput && logLevel <= NetDebugLevel::LOG_WARN)
        {
            if (debugLog != nullptr)
            {
                debugLog->warn(fmt, std::forward<Args>(args)...);
            }
            else
            {
                spdlog::warn(fmt, std::forward<Args>(args)...);
            }
        }
    }

    template<typename... Args>
    inline void Info(spdlog::format_string_t<Args...> fmt, Args &&... args)
    {
        if (logOutput && logLevel <= NetDebugLevel::LOG_INFO)
        {
            if (debugLog != nullptr)
            {
                debugLog->info(fmt, std::forward<Args>(args)...);
            }
            else
            {
                spdlog::info(fmt, std::forward<Args>(args)...);
            }
        }
    }

    template<typename... Args>
    inline void Debug(spdlog::format_string_t<Args...> fmt, Args &&... args)
    {
        if (logOutput && logLevel <= NetDebugLevel::LOG_DEBUG)
        {
            if (debugLog != nullptr)
            {
                debugLog->debug(fmt, std::forward<Args>(args)...);
            }
            else
            {
                spdlog::debug(fmt, std::forward<Args>(args)...);
            }
        }
    }

    // 释放日志资源
    void Dispose();
}

#endif
